Skip to content

feat(pages): add a tabs widget whose tabs hold their own widgets - #3217

Open
rubenvdlinde wants to merge 2 commits into
feat/noid/start-page-uifrom
feat/noid/tabs-widget-ui
Open

rubenvdlinde wants to merge 2 commits into
feat/noid/start-page-uifrom
feat/noid/tabs-widget-ui

Conversation

@rubenvdlinde

@rubenvdlinde rubenvdlinde commented Nov 3, 2026 •

Copy link
Copy Markdown

Part of #3099, on top of #3216 (start page). The UI of the tabs widget from #3212: several grids in the room of one, each tab holding its own widgets, tables and views included. The tab strip and the description button come from #3091 by @taiebot, who is co-author of the commit; here they live in a widget instead of on the start page.

Like #3212, this can be dropped without affecting the others if the model of #3212 isn't wanted.

Size: 680 lines: 466 code and 214 tests.

What changes

  • The tab strip follows the tabs pattern: one tab stop, the arrow keys, Home and End, Enter or Space.
  • In edit mode each tab has "Add widget to this tab", and its widgets are dragged, resized, configured and removed like any other, also from their menu. Saving sends parentIndex and parentTab for the widgets in a tab. Removing a tabs widget removes the widgets in its tabs; a tabs widget that loses tabs moves their widgets into its last tab. The widget dialog doesn't offer Tabs inside a tab.
  • A table or view widget shows the description of its table or view behind a "Show description" button (aria-expanded, aria-controls) instead of above the rows, so tables in a widget keep their room.

How it was tested

On Nextcloud 34 with PostgreSQL:

  • Playwright context-tabs-widget.spec.ts: tabs with a text and a table, the keyboard, the description button; adding a widget to a tab in edit mode and finding it after a reload. context-grid-pages.spec.ts again.
  • Cypress component tests TabsWidget.cy.js (one grid per tab, keyboard, saving with parentIndex) and CollapsibleDescription.cy.js
  • npm run lint, npm run stylelint and npm run build
  • no PHP changes

Known gap: dragging a widget inside a tab with the mouse doesn't move it yet; the drag is taken by the grid of the page (GridStack nested in GridStack). Moving and resizing from the widget's menu works inside tabs, and dragging on the page itself works. This needs fixing before this pull request leaves draft.

🖼️ Screenshots

Desktop (1400 px) Phone (420 px)
A tabs widget
A tab with a description
Editing the tabs

🏁 Checklist

  • ⛑️ Tests (unit and/or integration) are included or not needed
  • 🔙 Backport requests are created or not needed: /backport to stableX.X
  • 📅 Milestone is set
  • 🌸 PR title is meaningful (if it should be in the changelog: is it meaningful to users?)

🤖 AI (if applicable)

  • The content of this PR was partly or fully generated using AI

rubenvdlinde and others added 2 commits November 6, 2026 07:38
A tabs widget puts several grids in the room of one: each tab holds its
own widgets, tables and views included. The tab strip follows the tabs
pattern for the keyboard, and in edit mode each tab can get widgets of
its own, saved with parentIndex and parentTab. A table or view widget
shows the description of its table or view behind a button.

Co-authored-by: taiebot <13300652+taiebot@users.noreply.github.com>
Assisted-by: ClaudeCode:claude-opus-5-5
Signed-off-by: Ruben van der Linde <ruben@conduction.nl>
A data widget shows the title of its table in its own heading, the table inside no
longer repeats it.

Assisted-by: ClaudeCode:claude-opus-5-5
Signed-off-by: Ruben van der Linde <ruben@conduction.nl>
@rubenvdlinde
rubenvdlinde force-pushed the feat/noid/tabs-widget-ui branch from 1181602 to 6472d8c Compare November 6, 2026 06:38
@rubenvdlinde
rubenvdlinde marked this pull request as ready for review November 6, 2026 08:24
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant